using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using OfficeOpenXml;
using Avalonia.Platform;
using System.Reflection;

namespace AvaAI批量点评系统.Services;

public class TemplateService
{
    private readonly string _templateResourcePath = "avares://AvaAI批量点评系统/Assets/模板.xlsx";

    public TemplateService()
    {
        // 许可证在App.Initialize()中设置
    }

    /// <summary>
    /// 从内置资源创建临时模板文件
    /// </summary>
    /// <returns>临时模板文件路径</returns>
    public async Task<string> CreateTempTemplateFileAsync()
    {
        try
        {
            // 从内置资源读取模板文件
            var assets = AssetLoader.Open(new Uri(_templateResourcePath));
            
            // 创建临时文件
            var tempPath = Path.Combine(Path.GetTempPath(), $"template_{Guid.NewGuid()}.xlsx");
            
            // 将资源内容写入临时文件
            using (var fileStream = File.Create(tempPath))
            {
                await assets.CopyToAsync(fileStream);
            }
            
            return tempPath;
        }
        catch (Exception ex)
        {
            throw new Exception($"创建临时模板文件失败: {ex.Message}");
        }
    }

    /// <summary>
    /// 检查内置模板资源是否存在
    /// </summary>
    /// <returns>是否存在</returns>
    public bool IsTemplateExists()
    {
        try
        {
            var assets = AssetLoader.Open(new Uri(_templateResourcePath));
            assets.Dispose();
            return true;
        }
        catch
        {
            return false;
        }
    }

    public async Task<List<string>> GenerateStudentReportsAsync(
        List<string> studentNames, 
        string courseName, 
        string grade,
        AliCloudAIService aiService,
        string customCourseIntroduction = "")
    {
        var generatedFiles = new List<string>();

        if (!IsTemplateExists())
        {
            throw new FileNotFoundException($"模板资源不存在: {_templateResourcePath}");
        }

        // 创建统一的输出文件夹
        var desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
        var timestamp = DateTime.Now.ToString("yyyyMMdd_HHmmss");
        var folderName = $"{courseName}_评价表_{timestamp}";
        var outputFolderPath = Path.Combine(desktopPath, folderName);
        
        // 确保文件夹存在
        if (!Directory.Exists(outputFolderPath))
        {
            Directory.CreateDirectory(outputFolderPath);
        }

        foreach (var studentName in studentNames)
        {
            try
            {
                var fileName = await GenerateStudentReportAsync(studentName, courseName, grade, aiService, outputFolderPath, customCourseIntroduction);
                generatedFiles.Add(fileName);
            }
            catch (Exception ex)
            {
                throw new Exception($"为学生 {studentName} 生成报告失败: {ex.Message}");
            }
        }

        return generatedFiles;
    }

    private async Task<string> GenerateStudentReportAsync(
        string studentName, 
        string courseName, 
        string grade,
        AliCloudAIService aiService,
        string outputFolderPath,
        string customCourseIntroduction = "")
    {
        var gradeRange = ConvertToGradeRange(grade);
        var outputFileName = $"{courseName}_{studentName}_{gradeRange}_评价表.xlsx";
        var outputPath = Path.Combine(outputFolderPath, outputFileName);

        // 从内置资源创建临时模板文件，然后复制到输出文件
        var tempTemplatePath = await CreateTempTemplateFileAsync();
        try
        {
            File.Copy(tempTemplatePath, outputPath, true);
        }
        finally
        {
            // 清理临时文件
            if (File.Exists(tempTemplatePath))
            {
                File.Delete(tempTemplatePath);
            }
        }

        using var package = new ExcelPackage(new FileInfo(outputPath));
        var worksheet = package.Workbook.Worksheets[0]; // 假设使用第一个工作表

        // 填写基础信息
        await FillBasicInformation(worksheet, studentName, courseName, grade, customCourseIntroduction);

        // 生成并填写AI评语
        await FillAIGeneratedContent(worksheet, studentName, courseName, grade, aiService);

        // 生成并填写课程内容
        FillCourseContent(worksheet, courseName);

        // 保存文件
        await package.SaveAsync();

        return outputPath;
    }

    private async Task FillBasicInformation(ExcelWorksheet worksheet, string studentName, string courseName, string grade, string customCourseIntroduction = "")
    {
        try
        {
            // 根据实际模板结构填写信息
            
            // 1. 填写课程名称 - 根据模板图片，课程名称在A1位置的合并单元格
            // 直接在A1位置填写课程名称
            worksheet.Cells["A1"].Value = courseName;
            
            // 为了确保兼容性，也在其他可能的位置尝试填写
            var courseNamePositions = new[] { "B1", "C1", "D1", "B2", "A2" };
            foreach (var position in courseNamePositions)
            {
                try
                {
                    // 检查该位置是否为空或包含"课程名称"等关键词
                    var cellValue = worksheet.Cells[position].Value?.ToString();
                    if (string.IsNullOrEmpty(cellValue) || 
                        cellValue.Contains("课程名称") || 
                        cellValue.Contains("课程") ||
                        cellValue.Equals("课程名称", StringComparison.OrdinalIgnoreCase))
                    {
                        worksheet.Cells[position].Value = courseName;
                    }
                }
                catch
                {
                    // 忽略单个位置的错误，继续尝试下一个位置
                }
            }
            
            // 2. 填写学生姓名 (B3位置，根据模板图片显示)
            worksheet.Cells["B3"].Value = studentName;
            
            // 3. 填写课程级别/年级范围 (D3位置)
            // 将单个年级转换为年级范围格式，例如 "三年级" -> "3-3年级"
            var gradeRange = ConvertToGradeRange(grade);
            worksheet.Cells["D3"].Value = gradeRange;
            
            // 4. 填写评级时间 (当前日期)
            var currentDate = DateTime.Now.ToString("yyyy年MM月dd日");
            worksheet.Cells["F3"].Value = currentDate; // 假设评级时间在F3
            
            // 5. 设置一些固定的评分
            SetDefaultGrades(worksheet);
            
            // 6. 填写A20行的课程总结内容
            FillCourseSummary(worksheet, courseName, customCourseIntroduction);
        }
        catch (Exception ex)
        {
            throw new Exception($"填写基础信息失败: {ex.Message}");
        }
    }

    private string ConvertToGradeRange(string grade)
    {
        // 将年级转换为数字范围格式
        var gradeNumber = grade switch
        {
            "一年级" => "1",
            "二年级" => "2", 
            "三年级" => "3",
            "四年级" => "4",
            "五年级" => "5",
            "六年级" => "6",
            _ => ExtractNumberFromGrade(grade)
        };

        // 如果是单个年级，创建范围格式 (例如: "3-3年级")
        if (!string.IsNullOrEmpty(gradeNumber))
        {
            return $"{gradeNumber}-{gradeNumber}年级";
        }

        // 如果已经是范围格式，直接返回
        if (grade.Contains("-") && grade.Contains("年级"))
        {
            return grade;
        }

        // 默认返回原值
        return grade;
    }

    private string ExtractNumberFromGrade(string grade)
    {
        // 从年级字符串中提取数字
        if (string.IsNullOrEmpty(grade)) return "1";
        
        for (int i = 1; i <= 6; i++)
        {
            if (grade.Contains(i.ToString()))
            {
                return i.ToString();
            }
        }
        
        return "1"; // 默认返回1年级
    }

    private void SetDefaultGrades(ExcelWorksheet worksheet)
    {
        // 随机评分数组 - 只包含A、A+，按照用户要求
        var grades = new[] { "A", "A+" };
        var random = new Random();
        
        // 根据用户要求，评分位置在F6-F19
        var gradePositions = new[] { "F6", "F7", "F8", "F9", "F10", "F11", "F12", "F13", "F14", "F15", "F16", "F17", "F18", "F19" };
        
        foreach (var position in gradePositions)
        {
            try
            {
                // 检查该位置是否原本有内容，如果是空的或者是"A"，就填写随机评分
                var currentValue = worksheet.Cells[position].Value?.ToString();
                if (string.IsNullOrEmpty(currentValue) || currentValue == "A")
                {
                    worksheet.Cells[position].Value = grades[random.Next(grades.Length)];
                }
            }
            catch
            {
                // 忽略错误，继续下一个位置
            }
        }
    }

    private async Task FillAIGeneratedContent(ExcelWorksheet worksheet, string studentName, string courseName, string grade, AliCloudAIService aiService)
    {
        try
        {
            // 生成学生个性化评语
            var personalizedComment = await GeneratePersonalizedComment(studentName, courseName, grade, aiService);

            // 填写A21行的课程总结和A22行的个性化评语
            FillPerformanceComment(worksheet, personalizedComment);
        }
        catch (Exception ex)
        {
            throw new Exception($"生成AI评语失败: {ex.Message}");
        }
    }

    private async Task<string> GeneratePersonalizedComment(string studentName, string courseName, string grade, AliCloudAIService aiService)
    {
        try
        {
            // 使用统一的AI服务生成评语，确保格式一致
            var comment = await aiService.GenerateCommentAsync(studentName, courseName, grade, "基础");
            
            // 检查并清理可能的占位符
            comment = CleanCommentContent(comment);
            
            // 不再进行截断，保持评语完整性
            // AI已经被要求生成150-200字的完整评语
            
            return comment;
        }
        catch
        {
            // 如果AI生成失败，使用预设的个性化模板
            return GenerateBackupComment(studentName, courseName);
        }
    }

    private string CleanCommentContent(string comment)
    {
        if (string.IsNullOrEmpty(comment)) return comment;
        
        // 移除常见的占位符
        var placeholders = new[]
        {
            "[您的名字]", "[你的名字]", "[老师姓名]", "[教师姓名]",
            "[学校名称]", "[学校]", "[班级]", "[班级名称]",
            "[课程名称]", "[学科]", "[年级]", "[学期]",
            "【您的名字】", "【你的名字】", "【老师姓名】", "【教师姓名】",
            "【学校名称】", "【学校】", "【班级】", "【班级名称】"
        };
        
        foreach (var placeholder in placeholders)
        {
            comment = comment.Replace(placeholder, "");
        }
        
        // 清理多余的空格和标点
        comment = System.Text.RegularExpressions.Regex.Replace(comment, @"\s+", " ");
        comment = comment.Replace(",,", ",").Replace("。。", "。").Replace("！！", "！");
        
        return comment.Trim();
    }

    private string GenerateBackupComment(string studentName, string courseName)
    {
        var encouragements = new[]
        {
            $"{studentName}同学在{courseName}课程中表现优异，课堂参与度高，学习态度端正。你善于思考，勇于提问，不满足于表面的理解，总是努力探索知识的深层内涵。在实践活动中，你展现出很强的动手能力和创新思维，能够将理论知识与实际操作有机结合。你的好奇心和探索精神让老师印象深刻，这种学习品质将是你未来成功的重要基石。希望你能继续保持这种积极向上的学习态度，在{courseName}的学习道路上不断进步，为自己创造更美好的未来。",
            $"{studentName}同学，你在{courseName}课程中的表现非常出色，思维敏捷，见解独到。课堂上你总是能够积极发言，提出有价值的问题和观点，这种批判性思维能力值得赞扬。在团队合作中，你展现出良好的沟通能力和协作精神，能够与同学们和谐相处，共同完成学习任务。你的学习方法科学有效，能够合理安排时间，平衡各项学习任务。老师特别欣赏你对知识的渴望和持之以恒的学习精神，相信通过不断努力，你一定能在{courseName}领域取得更大成就。",
            $"在{courseName}课程学习中，{studentName}同学展现出了优秀的学习能力和良好的学习习惯。你上课专注听讲，积极参与课堂讨论，能够准确理解和掌握所学内容。在实践环节中，你表现出色，动手能力强，善于将理论知识运用到实际操作中。你的学习态度认真负责，作业完成质量高，体现了严谨的学习作风。老师欣赏你的勤奋努力和持续进步的精神，这种品质将帮助你在学习的道路上走得更远。希望你能继续发扬这些优点，在{courseName}的学习中取得更优异的成绩。"
        };
        
        var random = new Random();
        return encouragements[random.Next(encouragements.Length)];
    }

    private void FillCourseSummary(ExcelWorksheet worksheet, string courseName, string customCourseIntroduction = "")
    {
        string summary;
        
        // 优先使用用户确认的课程介绍
        if (!string.IsNullOrEmpty(customCourseIntroduction))
        {
            summary = customCourseIntroduction;
        }
        else
        {
            // 根据不同课程生成对应的A20行总结内容（保留原有逻辑作为备用）
            var courseSummaries = new Dictionary<string, string>
            {
                ["乐高机器人搭建"] = "本学期的乐高机器人搭建课程巧妙融合了\"理论与实践交织、创客搭建及实地应用挑战\"的多元化教学模式，打造出一个富有韵律的创新探索平台。我们致力于在探索与游戏的愉悦氛围中激发学生的主动思维，让学习过程成为一场充满乐趣的知识探险。",
                ["智能穿越机器人"] = "本学期的智能穿越机器人课程巧妙融合了\"理论与实践交织、创客搭建及实地应用挑战\"的多元化教学模式，打造出一个富有韵律的创新探索平台。我们致力于在探索与游戏的愉悦氛围中激发学生的主动思维，让学习过程成为一场充满乐趣的知识探险。",
                ["科学实验"] = "本学期的科学实验课程采用\"观察与探索并行、理论与实践结合、创新思维培养\"的教学理念，为学生构建了一个充满好奇心的探索乐园。我们通过有趣的实验活动激发学生的科学兴趣，让每一次实验都成为一次精彩的发现之旅。",
                ["GESP图形化编程（一）级"] = "本学期的GESP图形化编程课程融合了\"逻辑思维训练、创意编程实践、计算思维培养\"的教学特色，为学生打造了一个寓教于乐的编程启蒙平台。我们注重在轻松愉快的氛围中培养学生的编程兴趣和逻辑思维能力。",
                ["GESP图形化编程（二）级"] = "本学期的GESP图形化编程（二）级课程深化了\"项目驱动学习、团队协作开发、创新应用设计\"的教学模式，引导学生在更高层次的编程实践中提升技能。我们鼓励学生发挥创造力，在编程的世界中自由翱翔。",
                ["GESP图形化编程（三）级"] = "本学期的GESP图形化编程（三）级课程注重\"算法优化思考、复杂项目管理、编程思维深化\"的高阶培养，为学生提供了挑战性的学习体验。我们致力于培养学生成为具有创新精神的小小程序员。",
                ["传感器搭建"] = "本学期的传感器搭建课程结合了\"硬件认知学习、电路连接实践、智能系统构建\"的综合教学法，让学生在动手实践中理解科技原理。我们专注于培养学生的工程思维和创新应用能力。",
                ["3D打印笔模型设计"] = "本学期的3D打印笔模型设计课程融入了\"空间想象培养、创意设计实现、艺术与科技结合\"的教学理念，为学生开启了立体创作的奇妙之门。我们鼓励学生将想象力转化为现实作品。",
                ["趣味思维"] = "本学期的趣味思维课程采用了\"逻辑推理训练、创新思维启发、问题解决能力培养\"的教学策略，在轻松有趣的氛围中锻炼学生的思维能力。我们让每一次思考都成为智慧的增长。",
                ["创意创客电路"] = "本学期的创意创客电路课程整合了\"电子知识学习、创意电路设计、实用作品制作\"的教学内容，让学生在创作中掌握电子技术。我们致力于培养具有创新精神的小创客。",
                ["车航模"] = "本学期的车航模课程结合了\"模型制作技艺、空气动力学原理、竞技体验乐趣\"的教学特色，让学生在制作和操控中感受科技魅力。我们注重理论与实践的完美结合，培养学生的动手能力和科学精神。"
            };

            // 如果找到对应课程的总结，使用特定总结；否则使用通用总结
            summary = courseSummaries.ContainsKey(courseName) 
                ? courseSummaries[courseName] 
                : $"本学期的{courseName}课程注重\"理论学习与实践操作并重、创新思维与技能培养结合\"的教学理念，为学生提供了丰富多彩的学习体验。我们致力于在快乐学习的氛围中培养学生的综合素质和创新能力。";
        }

        worksheet.Cells["A20"].Value = summary;
    }

    private void FillPerformanceComment(ExcelWorksheet worksheet, string comment)
    {
        // 在A22位置开始填写AI生成的个性化评语
        worksheet.Cells["A22"].Value = comment;
    }

    private void FillCourseContent(ExcelWorksheet worksheet, string courseName)
    {
        try
        {
            // 根据课程名称生成课程内容/大纲介绍
            var courseContent = GenerateCourseContent(courseName);

            // 查找课程内容位置
            for (int row = 20; row <= 100; row++)
            {
                for (int col = 1; col <= 10; col++)
                {
                    var cellValue = worksheet.Cells[row, col].Value?.ToString();
                    if (!string.IsNullOrEmpty(cellValue))
                    {
                        if (cellValue.Contains("课程内容") || cellValue.Contains("当堂课") || 
                            cellValue.Contains("教学内容") || cellValue.Contains("课程大纲"))
                        {
                            worksheet.Cells[row + 1, col].Value = courseContent;
                            return;
                        }
                    }
                }
            }

            // 如果没有找到特定位置，在固定位置填写
            worksheet.Cells["A48"].Value = "当堂课程内容：";
            worksheet.Cells["A49"].Value = courseContent;
        }
        catch (Exception ex)
        {
            throw new Exception($"填写课程内容失败: {ex.Message}");
        }
    }

    private string GenerateCourseContent(string courseName)
    {
        var courseContents = new Dictionary<string, List<string>>
        {
            ["乐高机器人搭建"] = new()
            {
                "学习基础搭建技巧，掌握齿轮传动原理，完成简单机械结构设计",
                "探索传感器应用，编程控制机器人运动，培养逻辑思维能力",
                "团队合作完成复杂机器人项目，提升创新设计和问题解决能力"
            },
            ["科学实验"] = new()
            {
                "观察物理现象，学习科学实验方法，培养观察和记录能力",
                "化学反应实验，了解物质变化规律，提升科学探究兴趣",
                "生物观察实验，认识生命现象，培养科学思维和实践能力"
            },
            ["GESP图形化编程（一）级"] = new()
            {
                "认识图形化编程界面，学习基础编程概念，完成简单动画制作",
                "掌握循环和条件语句，创建互动小游戏，培养计算思维",
                "综合运用编程知识，设计个人作品，提升创造力和逻辑思维"
            },
            ["传感器搭建"] = new()
            {
                "认识各类传感器原理，学习电路连接方法，完成基础传感器实验",
                "编程控制传感器采集数据，制作智能检测装置，培养工程思维",
                "设计复合传感器系统，解决实际问题，提升创新应用能力"
            }
        };

        // 根据课程名称获取对应内容，如果没有匹配的则生成通用内容
        if (courseContents.ContainsKey(courseName))
        {
            var contents = courseContents[courseName];
            var random = new Random();
            return contents[random.Next(contents.Count)];
        }

        // 通用课程内容
        return $"本次{courseName}课程主要学习核心理论知识，通过实践操作加深理解，培养学生的动手能力和创新思维，提升综合素质和学科兴趣。";
    }

    /// <summary>
    /// 获取内置模板资源信息
    /// </summary>
    /// <returns>模板信息字符串</returns>
    public async Task<string> GetTemplateInfoAsync()
    {
        if (!IsTemplateExists())
        {
            return "模板资源不存在";
        }

        try
        {
            // 创建临时模板文件来获取信息
            var tempTemplatePath = await CreateTempTemplateFileAsync();
            try
            {
                using var package = new ExcelPackage(new FileInfo(tempTemplatePath));
                var worksheet = package.Workbook.Worksheets[0];
                var rowCount = worksheet.Dimension?.Rows ?? 0;
                var colCount = worksheet.Dimension?.Columns ?? 0;
                
                return $"模板资源信息：\n资源路径：{_templateResourcePath}\n工作表数量：{package.Workbook.Worksheets.Count}\n行数：{rowCount}，列数：{colCount}\n状态：内置资源，已成功加载";
            }
            finally
            {
                // 清理临时文件
                if (File.Exists(tempTemplatePath))
                {
                    File.Delete(tempTemplatePath);
                }
            }
        }
        catch (Exception ex)
        {
            return $"读取模板资源失败：{ex.Message}";
        }
    }
} 